# D:\dazuoye\app\views\task3_social.py

from flask import Blueprint, jsonify
from app.data_loader import social_media_data
import pandas as pd
from collections import Counter

# 创建蓝图对象
task3_bp = Blueprint('task3_social', __name__)


# --- 辅助函数：生成词云数据 ---
def generate_word_cloud_data(phrase_series):
    """
    直接统计完整的评论短语或句子的频率，不再进行分词。
    """
    # 移除空值和内容为 "无" 的行
    phrases = phrase_series.dropna()
    phrases = phrases[phrases != '无']

    # 使用 Counter 直接统计每个完整短语的出现次数
    phrase_counts = Counter(phrases)

    # 格式化为词云库需要的数据格式，并返回频率最高的前100个
    return [{"name": phrase, "value": count} for phrase, count in phrase_counts.most_common(100)]


# --- API 接口 ---

# 【已按您的新要求修改】
@task3_bp.route('/api/marketing/sentiment_trend', methods=['GET'])
def get_sentiment_trend():
    """
    新版逻辑：返回每个月的平均情感得分。
    """
    if social_media_data is None:
        return jsonify({"error": "社交媒体数据未能加载"}), 500

    try:
        df = social_media_data.copy()
        df['日期'] = pd.to_datetime(df['日期'])
        df.set_index('日期', inplace=True)

        # 1. 按月重采样 ('MS'代表Month Start) 并计算平均情感得分
        monthly_sentiment = df['情感得分'].resample('MS').mean()

        if not monthly_sentiment.empty:
            # 2. 创建一个完整的、连续的月份范围，以处理数据中可能存在的空缺月份
            full_month_range = pd.date_range(start=monthly_sentiment.index.min(), end=monthly_sentiment.index.max(),
                                             freq='MS')
            monthly_sentiment = monthly_sentiment.reindex(full_month_range)

            # 3. 计算所有非空月份的总体平均分
            overall_monthly_avg = monthly_sentiment.mean()

            # 4. 用总体平均分填充没有任何数据的月份
            monthly_sentiment.fillna(overall_monthly_avg, inplace=True)

        # 5. 格式化为JSON输出
        result = {
            "dates": monthly_sentiment.index.strftime('%Y-%m').tolist(),
            "scores": [round(score, 3) for score in monthly_sentiment.tolist()]
        }
        return jsonify(result)

    except Exception as e:
        return jsonify({"error": f"处理情感趋势数据时出错: {str(e)}"}), 500


@task3_bp.route('/api/marketing/word_clouds', methods=['GET'])
def get_word_clouds():
    """API: 返回正面和负面词云图数据"""
    if social_media_data is None:
        return jsonify({"error": "社交媒体数据未能加载"}), 500

    # 调用辅助函数分别处理正面和负面评论
    positive_word_cloud = generate_word_cloud_data(social_media_data['热门正面评论'])
    negative_word_cloud = generate_word_cloud_data(social_media_data['热门负面评论'])

    result = {
        "positive": positive_word_cloud,
        "negative": negative_word_cloud
    }
    return jsonify(result)